ICTSC2018 本戦 問題解説: トラブルが起こるのは筋肉が足りないから!!!

問題文

同期から次の依頼がありました。

「会社の上司から勉強用にとサーバーをいただきました!
Webページを立ててみたかったのでNginxをインストールしようとしていたのですが、

sudo apt-get install nginx
をするとエラーが出てしまってインストールできないんです…
どうしたら良いんですかね…?」

問題を解決して、インストールがエラーや警告なしで成功するようにしてください。

問題のスタート状態

  • サーバーへのHTTP通信が失敗する

問題のゴール状態

  • Nginxがapt-getによってエラーや警告なしにインストールされている
  • サーバーへHTTP通信ができる

トラブルの概要

Nginxをインストールしようとしたがエラーが発生してインストールが完了しない。

解説

今回のトラブルの原因は /var/log 配下にあるファイル全てにi属性(Immutable属性)が付与されていたからでした。

今回のトラブルが起こる流れとして /var/log配下にあるdpkg.logをアップデートしようとするとコピーなどは成功するが、インストール後スクリプト(post_install)の実行時にdpkg.logファイルの権限変更(chmod)が失敗し、インストール失敗(再インストール)としてマークされます
そして、次回インストール時にpost_installスクリプトが実行されるように予約がされます。

なので、Nginx(その他のパッケージ)をインストールしようとすると再インストールがマークされたdpkgが優先的にインストールされようとしますが、同じ理由で再失敗するのでそれ以降のインストールが無視される(インストール失敗とマークされる)といった流れでした。

ですので、今回は以下のコマンドでdpkg.logのi属性をはずしたらインストールは完了します。

また、今回のゴールはNginxがapt-getによってエラーや警告なしにインストールされているも含まれています。
エラーや警告を解決していない回答が多く見られました。
今回エラーや警告が出ていた原因は/var/logのaptディレクトリにもi属性が付与されていたためです。
なので、aptディレクトリもi属性をはずしたら今回のトラブルは解決です。

回答例

50%

$ cd /var/log
$ sudo chattr -i dpkg.log

もしくは

$ sudo rm -rf /var/lib/dpkg/info/dpkg.postinst
$ sudo rm -rf /var/lib/dpkg/info/dpkg.postrm
$ sudo dpkg --configure dpkg

以上のようにNginxのインストールに成功すれば手段は問わず50%の点数を与えました。

100%

$ cd /var/log
$ sudo chattr -i *
$ sudo apt-get install nginx

2行目が sudo chattr -i aptでも問題ありません。

Nginxのインストール時にエラーや警告がでなければ100%の点数を与えました。

採点基準

  • sudo apt-get install nginxで正常にインストールされない。(0%)
  • sudo apt-get install nginxでインストールされHTTP通信はできるが、インストール時にwarningが消えていない。(50%)
  • sudo apt-get install nginx正常にインストールされHTTP通信ができ、インストール時にwarningがでない。(100%)